Skip to content

vector 容器

vector(向量):C++中的一种数据结构,确切的说是一个类。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,可以使用 vector 来解决问题,以达到最大节约空间的目的。

可以简单的认为,向量是一个能够存放任意类型的动态数组

使用前提

1.使用 vector 必须使用头文件 vector
2.vector 属于 std 命名空间的,注意使用 using name std;

vector 的定义

  • 基本语法
vector<type> vactor_name;

例如: vector<int> vec; 创建一个数组类型是 int 类型的动态数组 vec;

  • 初始化 ① 这个语句将 vec 定义为 10 个整数的矢量,但这只是一个起始大小。但没有给出初值,其值是不确定的。
c
vector<int> vec(10);

② 在这个语句中,vec 被定义为 10 个整数矢量,并且 numbers 中的每个元素都被初始化值 2。

c
vector<int> vec(10,2);

③ 该语句定义了一个名为 numbers 的 int 矢量。该矢量有 4 个元素,其初始化值为 10,20,30 和 40。

c
vector<int> numbers {10, 20, 30, 40};

注意,初始化列表被括在一组大括号中,但是在它前面不使用赋值运算符(=)。

基本函数实现

添加元素

  • push_back()
    vec.push_back()
    在尾部加入一个数据

例如:

c
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> vec;
    //在尾部加入数字10
	vec.push_back(10);
    //在尾部加入数字20
	vec.push_back(20);
    //在尾部加入数字30
	vec.push_back(30);
	return 0;
}

动态数组的访问

  • front()

vec.front()
返回 vec 的第一个元素值

  • back() vec.back()
    返回 vec 的第一个元素值
  • vec[i]
    返回 a 的第 i 个元素,当且仅当 a[i]存在

-示例:

动态数组的访问 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	cout << "第一个元素是:" << vec.front() << endl;
	cout << "最后一个元素是:" << vec.back() << endl;
	cout << "下标为1的元素值是" << vec[1] << endl;
    return 0;
}

运行结果:

c
第一个元素是:10
最后一个元素是:30
下标为1的元素值是20

遍历函数

  • 借助迭代器进行访问
    遍历 vector 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	for (vector<int>::iterator it = vec.begin();it != vec.end();it++){
		cout << *it << endl;
 	}
    return 0;
}

运行结果:

c
10
20
30

:::

  • 以数组的方式访问
遍历 vector 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
    return 0;
}

运行结果:

c
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30

分析

size 函数得到的是容器里的元素个数
这种遍历方式会比较推荐

删除函数

  • pop_back()

vec.pop_back()
删除最后一个数据

  • clear()

vec.clear()
移除容器中所有的数据

  • erase()

① 删除单个元素

vec.erase(vec.begin + num)
删除下标 num 位置上的元素

删除单个元素 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	cout << "删除前:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
	vec.erase(vec.begin() + 1);
	cout << "删除后:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
    return 0;
}

运行结果:

c
删除前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
删除后:
第1个元素值是:10
第2个元素值是:30

分析

删除的是下标 1 位置上的元素 20,后面的元素自动往前补齐。

② 删除某一范围的元素

vec.erase(vec.begin + num1,vec.begin + num2)
删除下标 num1 到下标 num2-1 区间位置上的元素

删除某一范围的元素 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	vec.push_back(40);
	vec.push_back(50);
	vec.push_back(60);
	cout << "删除前:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
	vec.erase(vec.begin() + 1,vec.begin() + 4);
	cout << "删除后:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
    return 0;
}

运行结果:

c
删除前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
删除后:
第1个元素值是:10
第2个元素值是:50
第3个元素值是:60

分析

删除的是下标 1 到下标 3 之间的元素 20,30,40,后面的元素自动往前补齐。

插入函数

  • 在指定位置上插入元素值 vec.insert(a.begin()+num,value);
    在下标 num 的位置上插入元素 value
删除某一范围的元素 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	vec.push_back(40);
	vec.push_back(50);
	vec.push_back(60);
	cout << "插入元素前:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
	vec.insert(vec.begin() + 1,100);
	cout << "插入元素后:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
    return 0;
}

运行结果:

c
插入元素前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
插入元素后:
第1个元素值是:10
第2个元素值是:100
第3个元素值是:20
第4个元素值是:30
第5个元素值是:40
第6个元素值是:50
第7个元素值是:60

分析

插入在下标 1 的位置上,原来下标 1 及以后的元素自动往后补齐。

  • 在指定位置 num 前插入 n 个值为 value 的元素
    vec.insert(vec.begin()+num,n,value) 在下标 num 位置上插入 n 个元素,值都是 value
删除某一范围的元素 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	vec.push_back(40);
	vec.push_back(50);
	vec.push_back(60);
	cout << "插入元素前:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
	vec.insert(vec.begin() + 1,2,100);
	cout << "插入元素后:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
    return 0;
}

运行结果:

c
插入元素前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
插入元素后:
第1个元素值是:10
第2个元素值是:100
第3个元素值是:100
第4个元素值是:20
第5个元素值是:30
第6个元素值是:40
第7个元素值是:50
第8个元素值是:60

分析

插入在下标 1 的位置上,连续 2 个元素 100,原来下标 1 及以后的元素自动往后补齐。

  • 在指定位置 num 前插入区间[start, end)的所有元素
    vec.insert(vec.begin()+num,vec+satrt,vec+end)
删除某一范围的元素 示例代码
cpp
#include<bits/stdc++.h>
#include<vector>
using namespace std;
int main()
{
    vector<int> vec;
	vec.push_back(10);
	vec.push_back(20);
	vec.push_back(30);
	vec.push_back(40);
	vec.push_back(50);
	vec.push_back(60);
	cout << "插入元素前:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
	vec.insert(vec.begin() + 1,vec.begin() + 2,vec.begin() + 5);
	cout << "插入元素后:" << endl;
	for (int i=0;i<vec.size();i++){
		cout << "第" << i+1 << "个元素值是:" << vec[i] << endl;
 	}
    return 0;
}

运行结果:

c
插入元素前:
第1个元素值是:10
第2个元素值是:20
第3个元素值是:30
第4个元素值是:40
第5个元素值是:50
第6个元素值是:60
插入元素后:
第1个元素值是:10
第2个元素值是:30
第3个元素值是:40
第4个元素值是:50
第5个元素值是:20
第6个元素值是:30
第7个元素值是:40
第8个元素值是:50
第9个元素值是:60

分析

vec.begin() + 2 到 vec.begin() + 5 这个区间的元素是 20,30,40,插入在在下标 1 的位置上,原来下标 1 及以后的元素自动往后补齐。

其他重要函数

  • a.size();
    返回 a 中元素的个数;
  • vec.begin();
    指向迭代器中的第一个元素
  • vec.end()
    指向迭代器中末端元素的下一个,指向一个不存在的元素

vector 函数列表

函数描述
at(index)读取 vector 指定索引 index 的元素的值。
begin()vector 的第一个元素的地址。
end()vector 的最后一个元素的下一个地址。
front()vector 的第一个元素的值。
back()vector 的最后一个元素的值。
size()vector 中元素的数量。
push_back(val)往 vector 最后插入一个元素 val。
insert(iterator,val)往 vector 指定位置插入元素 val。
emplace(iterator,val)往 vector 指定位置插入元素 val。
pop_back()删除 vector 最后一个元素。
erase(iterator)删除 vector 指定位置的元素。
clear()清空 vector。
empty()检查 vector 是否为空。
assign()从指定范围内赋值给 vector。